package gbase

import (
	"sync"

	"github.com/cloudwego/hertz/pkg/common/hlog"
)

//观察者模式

// 定义通用消息接口
type IMsg interface {
	IConfig

	//获取消息类型
	GetType() string
}

// 定义观察者接口
type IObserver interface {

	//由实现类直接指定自己处理消息的类型
	GetType() string

	// 处理消息的方法
	HandleMessage(child any, msg IMsg) error
}

// 观察者集线器，用于管理观察者
// //TODO 使用工作池而不是无限制创建goroutine
type ObserverHub struct {
	observers sync.Map // key 为消息类型,value=IObserver
	// observers map[string]IObserver // 使用 map 存储观察者，key 为消息类型

}

// 注册观察者，key 为消息类型
func (s *ObserverHub) Register(msgType string, observer IObserver) {
	s.observers.Store(msgType, observer)
	//s.observers[msgType] = observer
}

// Unregister 注销观察者
func (s *ObserverHub) Unregister(msgType string) {
	s.observers.Delete(msgType)
	//delete(s.observers, msgType)
}

// Notify 通知观察者处理消息
func (s *ObserverHub) Notify(child any, msg IMsg) (err error) {

	// 根据消息类型找到对应的观察者
	msgType := msg.GetType()
	if observer, exists := s.observers.Load(msgType); exists {
		go func() {
			if err = observer.(IObserver).HandleMessage(child, msg); err != nil {
				hlog.Errorf("ObserverHub.Notify 消息处理失败: %v", err)
				return
			}
		}()
	} else {
		hlog.Debugf("ObserverHub.Notify 未实现该类消息的处理 msg:%s", msg.ToString(msg))
	}
	return nil
}

func NewObserverHub() *ObserverHub {
	return &ObserverHub{
		observers: sync.Map{},
		// observers: make(map[string]IObserver),
	}
}
